<?

/**
 * Contactos class
 *
 * Esta clase maneja los contactos
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@elserver.com>
 * @version 1.0
 * @package Contactos
*/
class Contactos extends Core {

	static protected $instancia;
	static protected $opciones = array(
		'rpp' => 100, // Resultados por pagina
		'page' => 1, // Numero de pagina por defecto
		'order' => array('c.empresa', 'ASC') // Ordenamiento de listar() con el tipo de ordenamiento (opcional)
	);
	private $count = 0;

	/**
	 * Constructor de la clase.
	 * 
	 * @param integer $id_caso (opcional) El id de caso al que pertenecen estos tags
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 */
	function __construct ($opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones = null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Lista los contactos
	 * 
	 * @param array $opciones (Opcional) Opciones validas para esta clase.
	 * @return array
	 */
	function listar ($opciones = null) {
		
		// Seteo las opciones
		$opciones = ($this instanceof self)? $this->opciones($opciones) : self::opciones($opciones);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Busco los contactos
		$contactos = array();
		if ($_contactos = $db->get_results("SELECT SQL_CALC_FOUND_ROWS c.* FROM contactos c WHERE 1=1 ORDER BY empresa"))
			foreach ($_contactos as $_contacto)
				$contactos[$_contacto['id_contacto']] = $_contacto;

		// Calculo la cantidad de resultados
		$count = $db->get_var("SELECT FOUND_ROWS()");
		if ($this instanceof self)
			$this->count = $count;
		
		// Calculo la cantidad de paginas
		$paginas = ($this instanceof self)? $this->paginas() : self::paginas($count, $opciones['rpp']);
			
		return array('paginas' => $paginas, 'resultados' => (int)$count, 'data' => $contactos);
	}
	
	/**
	 * Devuelve la cantidad de paginas que devolvio la consulta
	 * 
	 * Los resultados son cargados previamente por la funcion listar
	 * @param array $count (Opcional) Cantidad total se resultados
	 * @param array $rpp (Opcional) Cantidad de resultados por pagina
	 * @return integer Cantidad de resultados
	 */
	public function paginas ($count=null, $rpp=null) {

		$rpp = (!$rpp)? self::$opciones['rpp'] : $rpp;
		$count = (!$count && $this instanceof self)? $this->count() : $count;

		// No se puede dividir por 0
		if ($rpp == 0)
			return 0;

		return ceil($count/$rpp);
	}
	
	
	/**
	 * Devuelve cuantos resultados hay en la consulta
	 * 
	 * Los resultados son cargados previamente por la funcion listar
	 * @return integer Cantidad de resultados
	 */
	public function count () {
		return $this->count;
	}
	
	
	/**
	 * Agrega un nuevo contacto
	 * 
	 * @param array $contacto Informacion del contacto a crear
	 * @return integer Id del contacto creado
	 */
	public function agregar ($contacto) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Agrego el producto
		$id_contacto = $db->insert('contactos', $contacto);

		return $id_contacto;
	}
	
	/**
	 * Elimina un contacto
	 * 
	 * @param integer $id_contacto El id de contacto que se quiere eliminar.
	 * @return boolean
	 */
	public function eliminar ($id_contacto = null) {		

		// Saneamiento de variables
		$id_contacto = addslashes($id_contacto);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo el objeto de sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Marco el producto como inactivo
		$db->query("DELETE FROM contactos WHERE id_contacto = '$id_contacto' LIMIT 1");

		return true;
	}
	
	/**
	 * Modifica un contacto
	 * 
	 * @param $id_contacto Id del contacto a modificar
	 * @param $contacto Nueva informacion del contacto
	 * @return boolean
	 */
	public function modificar ($id_contacto, $contacto) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Modifico el producto
		$db->update('contactos', array_merge($contacto, array('id_contacto' => $id_contacto)));

		return true;
	}
	
	/**
	 * Devuelve toda la informacion de un contacto en formato array
	 * 
	 * @param integer $id_contacto El id del contacto del que se quiere la informacion
	 * @return array
	 */
	function get ($id_contacto) {

		// Saneamiento de variables
		$id_contacto = addslashes($id_contacto);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Busco el contacto solicitado
		if (!$contacto = $db->get_row("SELECT * FROM contactos WHERE id_contacto = $id_contacto"))
			return ($this)? $this->fail('No se encontro el contacto solicitado') : false;	
			
		return $contacto;
	}

}

?>
